package com.atguigu.java2;

import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

/**
 *      创建线程的方式四：使用线程池
 *
 *      好处：
 *          1.提高响应速度（减少了创建新线程的时间）
 *          2. 降低资源消耗（重复利用线程池中线程，不需要每次都创建）
 *          3.便于线程管理
 *               corePoolSize：核心池的大小
 *               maximumPoolSize：最大线程数
 *               keepAliveTime：线程没有任务时最多保持多长时间后会终止
 *
 *      面试题：创建多线程有几种方式？四种
 *
 * @author : leimingchao
 * @date Date : 2021年10月02日 16:29
 */
public class ThreadPool {

    public static void main(String[] args) {

        //1.提供指定线程数量的线程池
        ThreadPoolExecutor executorService = (ThreadPoolExecutor) Executors.newFixedThreadPool(10);

        //设置线程池的属性
        // System.out.println(executorService.getClass());
        executorService.setCorePoolSize(15);
        // executorService.setKeepAliveTime();
        //适合适用Runnable
        //2.执行指定的线程的操作，需要提供实现Runnable接口或者Callable接口实现类的对象
        executorService.execute(new NumberThread2());
        executorService.execute(new NumberThread3());
        //适合适用于Callable
        // executorService.submit(Callable callable);

        //3.关闭连接池
        executorService.shutdown();
    }
}

class NumberThread2 implements Runnable {

    @Override
    public void run() {
        for (int i = 0; i <= 100; i++) {
            if (i % 2 == 0) {
                System.out.println(Thread.currentThread().getName() + ":" +i);
            }
        }
    }
}

class NumberThread3 implements Runnable {

    @Override
    public void run() {
        for (int i = 0; i <= 100; i++) {
            if (i % 2 != 0) {
                System.out.println(Thread.currentThread().getName() + ":" +i);
            }
        }
    }
}
